const { WebSocketServer } = require('ws');
const HMR_HEADER = 'vite-hmr';
function createWebSocketServer(httpServer) {
  // noServer: true // websocket 服务器可以和 http 服务器共享地址和端口
  const wss = new WebSocketServer({ noServer: true });
  // 把通信协议从 http 协议升级为 websocket 协议
  httpServer.on('upgrade', (req, socket, head) => {
    if (req.headers['sec-websocket-protocol'] === HMR_HEADER) {
      wss.handleUpgrade(req, socket, head, (ws) => {
        wss.emit('connection', ws, req); // 连接成功, 派发 connection 事件, ws 会监听到 connection 然后给客户端发送消息
      });
    }
  });
  // 当服务器监听到客户端的连接请求成功的时候
  wss.on('connection', (socket) => {
    // 连接成功后，向客户端发送消息，表示连接成功
    socket.send(JSON.stringify({ type: 'connected' }));
  });
  return {
    on: wss.on.bind(wss), // 通过 on 方法可以监听客户端发过来的请求
    off: wss.off.bind(wss), // 通过 off 方法可以取消监听客户端发过来的请求
    // 调用此方法可以向所有的客户端发送消息
    send(payload) {
      const stringified = JSON.stringify(payload);
      // 循环所有的客户端，发送消息
      wss.clients.forEach((client) => {
        if (client.readyState === 1) {
          client.send(stringified);
        }
      });
    },
  };
}
exports.createWebSocketServer = createWebSocketServer;
